package com.returnsoft.util;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.text.StrTokenizer;

import java.util.Enumeration;
import java.util.regex.Pattern;
//import com.sun.org.apache.xalan.internal.xsltc.compiler.Pattern;

public class IpUtils {
	
	  public static final String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";

	  public static final Pattern pattern = Pattern.compile("^(?:" + _255 + "\\.){3}" + _255 + "$");

	  public static String longToIpV4(long longIp) {

	    int octet3 = (int) ((longIp >> 24) % 256);

	    int octet2 = (int) ((longIp >> 16) % 256);

	    int octet1 = (int) ((longIp >> 8) % 256);

	    int octet0 = (int) ((longIp) % 256);

	    return octet3 + "." + octet2 + "." + octet1 + "." + octet0;

	  }

	  public static long ipV4ToLong(String ip) {

	    String[] octets = ip.split("\\.");

	    return (Long.parseLong(octets[0]) << 24) + (Integer.parseInt(octets[1]) << 16) +

	        (Integer.parseInt(octets[2]) << 8) + Integer.parseInt(octets[3]);

	  }

	  public static boolean isIPv4Private(String ip) {

	    long longIp = ipV4ToLong(ip);

	    return (longIp >= ipV4ToLong("10.0.0.0") && longIp <= ipV4ToLong("10.255.255.255")) ||

	        (longIp >= ipV4ToLong("172.16.0.0") && longIp <= ipV4ToLong("172.31.255.255")) ||

	        longIp >= ipV4ToLong("192.168.0.0") && longIp <= ipV4ToLong("192.168.255.255");

	  }

	  public static boolean isIPv4Valid(String ip) {

	    return pattern.matcher(ip).matches();

	  }

	  public static String getIpFromRequest(HttpServletRequest request) {
		  
		  System.out.println("Ingreso a getIpFromRequest");

	    String ip;

	    boolean found = false;
	    
	    System.out.println("aqui:"+request.getHeader("x-forwarded-for"));
	    Enumeration<String> numi = request.getHeaderNames();
	    while(numi.hasMoreElements()) {
	    	System.out.println("elementox:"+numi.nextElement());
			
		}

	    if ((ip = request.getHeader("x-forwarded-for")) != null) {
	    	
	    	System.out.println("ip1"+ip);

	      StrTokenizer tokenizer = new StrTokenizer(ip, ",");

	      while (tokenizer.hasNext()) {

	        ip = tokenizer.nextToken().trim();
	        
	        System.out.println("ip2:"+ip);

	        if (isIPv4Valid(ip) && !isIPv4Private(ip)) {

	          found = true;

	          break;

	        }

	      }

	    }

	    if (!found) {

	      ip = request.getRemoteAddr();

	    }

	    return ip;

	  }

}
